Java异常如何解决

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java异常如何解决相关的知识,希望对你有一定的参考价值。

在 Java 应用程序中,异常处理机制为:抛出异常,捕捉异常。
抛出异常:当一个方法出现错误引发异常时,方法创建异常对象并交付运行时系统,异常对象中包含了异常类型和异常出现时的程序状态等异常信息。运行时系统负责寻找处置异常的代码并执行。
捕获异常:在方法抛出异常之后,运行时系统将转为寻找合适的异常处理器(exception handler)。潜在的异常处理器是异常发生时依次存留在调用栈中的方法的集合。当异常处理器所能处理的异常类型与方法抛出的异常类型相符时,即为合适 的异常处理器。运行时系统从发生异常的方法开始,依次回查调用栈中的方法,直至找到含有合适异常处理器的方法并执行。当运行时系统遍历调用栈而未找到合适 的异常处理器,则运行时系统终止。同时,意味着Java程序的终止。
对于运行时异常、错误或可查异常,Java技术所要求的异常处理方式有所不同。
由于运行时异常的不可查性,为了更合理、更容易地实现应用程序,Java规定,运行时异常将由Java运行时系统自动抛出,允许应用程序忽略运行时异常。
对于方法运行中可能出现的Error,当运行方法不欲捕捉时,Java允许该方法不做任何抛出声明。因为,大多数Error异常属于永远不能被允许发生的状况,也属于合理的应用程序不该捕捉的异常。
参考技术A 可以让虚拟机自己处理可以自己定义一个异常类 参考技术B throws Exception 往外抛,或者用try 和catch包围 参考技术C 用 try catch 去进行异常处理。

如何解决线程“main”中的异常,java.lang.ArithmeticException:/为零? [关闭]

【中文标题】如何解决线程“main”中的异常,java.lang.ArithmeticException:/为零? [关闭]【英文标题】:How to solve exception in thread "main", java.lang.ArithmeticException: / by zero? [closed] 【发布时间】:2011-10-26 06:44:22 【问题描述】:

我在线程“main”中不断收到异常:

java.lang.ArithmeticException: / by zero
at PersonalityTest.percentage(PersonalityTest.java:85)
at PersonalityTest.main(PersonalityTest.java:19)

并且我想在扫描仪每次读取 A 或 B 时添加计数并获得 B 的百分比。

import java.io.*;
import java.util.*;

public class PersonalityTest 

    public static final int dimen = 4;

    public static void main(String [] args) throws FileNotFoundException 
        Scanner input = new Scanner(new File("personality.txt"));
        PrintStream out = new PrintStream(new File("output.txt"));

        int[] a = new int[4];
        int[] b = new int[4];

        welcome();

        while (input.hasNextLine()) 
           String letter = letter(input, out);
           countNum(a, b, out, letter);
           int[] percentage = percentage(a, b, out);
           type(out, percentage);
           out.println("");
        
    

    public static void welcome () 
        System.out.println("The Keirsey Temperament Sorter is a test that measures four independent dimensions of your personality: ");
        System.out.println("1. Extrovert versus Introvert (E vs. I): what energizes you");
        System.out.println("2. Sensation versus iNtuition (S vs. N): what you focus on");
        System.out.println("3. Thinking versus Feeling (T vs. F): how you interpret what you focus on");
        System.out.println("4. Judging versus Perceiving (J vs. P): how you approach life");
        System.out.println("");
    


    public static String letter (Scanner input, PrintStream out) 
        String name = input.nextLine();
        out.println(name + ":");
        String letter = input.nextLine();
        return letter;
    

    public static void countNum(int[] a, int[] b, PrintStream out, String letter) 
        int[] countA = new int[7];
        int[] countB = new int[7];
        int n = 0;

        out.print("answers: [");

        for (int i = 0; i < letter.length(); i++) 
            int type = i % 7;

            if (letter.charAt(i) == 'A' || letter.charAt(i) == 'a') 
               n = 1;
            
            else if (letter.charAt(i) == 'B' || letter.charAt(i) == 'b') 
               n = 1;
            
            countA[type] += n;
            countB[type] += n;

            if (type == 2 || type == 4 || type == 6) 
               a[type / 2] = countA[type - 1]+ countA[type];
               b[type / 2] = countB[type - 1]+ countA[type];
             else if (type == 0) 
               a[0] = countA[0];
               b[0] = countB[0];
            
            for (int j = 0; j < dimen; j++) 
                out.print(a[j] + "A-" + b[j] + "B," + " ");
            
        
        out.print("]");
    

    public static int[] percentage (int[] a, int[] b, PrintStream out) 
       int[] percentage = new int [4];
       out.print("percent B: [");
       double n = 0.0;

       for (int i = 0; i < dimen; i++) 
           n = b[i] * 100 / (a[i] + b[i]); // <--- This is where I get error
           percentage [i] = (int) Math.round(n);
           out.print(percentage[i]);
       

       out.print("]");
       return percentage;
    

    public static void type (PrintStream out, int[] percentage) 
        String[] type = new String [4];

        out.print("type: ");

        for (int i = 0; i <= dimen; i++) 
            while (percentage[i] > 50) 
                if (i == 0) 
                    type[1] = "I";
                
                else if (i == 1) 
                    type[2] = "N";
                
                else if (i == 2) 
                    type[3] = "F";
                
                else 
                    type[4] = "P";
                
            

            while (percentage[i] < 50) 
                if (i == 0) 
                    type[1] = "E";
                
                else if (i == 1) 
                    type[2] = "S";
                
                else if (i == 2) 
                    type[3] = "T";
                
                else 
                    type[4] = "J";
                
            
            out.print(Arrays.toString(type));
        
    

【问题讨论】:

不要在 PersonalityTest.java 的第 85 行除以零。精明吗? 【参考方案1】:

对于所有 a、b、+1、-1、/2 等,您的逻辑都很难遵循。您应该尝试将其减少到能证明您的问题的最少代码量。很可能你会在这样做的时候发现问题。您还可以提供一些示例输入。如果没有其中一项或两项,就很难帮助您解决问题。

更新:现在我看到了许多看起来像问题的事情,因为我看到了你正在尝试做的事情。除非我弄错了,否则您的输入文件在第一行有一个名称,然后是 70 行,每行都有一个字母?

一方面,当读取一封信并将其发送到 countNum() 时,您只有一个名为“n”的变量,无论您看到 A 还是 B,您都会递增该变量,然后将“n”添加到两个 A和 B。这不是在 A 的数量或 B 的数量上加一。它总是给它们都加一个。

接下来,由于您只向 countNum() 发送了一个字母,因此外部 for 循环将只执行一次。这意味着您只能将值放入 a[0] 和 b[0]。此外,由于“n”问题,两个值都将始终为 1。因此,一旦您进入内部 for 循环,它将始终打印“1A-1B,0A-0B,0A-0B,0A-0B”答案的第一部分。

之后,您的 percent() 方法不起作用的原因应该很明显了。数组中除第一个位置外的所有位置均为零。

附加内容:您定义了一个等于 4 的常量“dimen”,但您有时使用该常量,有时使用文字“4”。选择一个并坚持下去。我推荐这个常量,我推荐给它命名一些有意义的东西,比如“NUMBER_OF_PERSONALITY_DIMENSIONS”,如果它是这样的话。就此而言,给你所有的变量起更好的名字,这会让你和我都更容易。此外,在您的 type() 方法中,您说 for ( int i = 0; i &lt;= dimen; i++ ) 迭代一个我认为只有 4 个元素的数组。那会坏掉的。最后,正如您在其他地方提到的那样,不要传递数组,用多种不同的方法改变它们。这是迷路的好方法。一般来说,使方法没有副作用。不要修改你传递给他们的东西,而是从方法中返回重要的值。

总的来说,我认为你需要休息一下,理清你想做的事情。这个逻辑似乎没有任何意义。

我不知道你是否已经了解了这种东西,但你可以考虑将它分为两​​类:一类用于读取数据,一类用于统计。计数的可能看起来像:

class Tallier 
    private int numberOfAs;
    private int numberOfBs;
    private int totalEntriesSoFar;
    private int[] typeATotals;
    private int[] typeBTotals;

    public void gotNewA() ...
    public void gotNewB() ...

【讨论】:

要求是从原来的70个A/B答案到As和B的计数,按维度分组;从计数到 B 的百分比;以及从百分比到四个字母的个性类型字符串。【参考方案2】:

你除以零,问题是这样的。在上述行中,您有:

 n = b[ i ] * 100 / ( a[ i ] + b[ i ] );

有时,a[i]+b[i] 为零。也许问题会通过这样的检查来解决:

 for( int i = 0; i < dimen; i++ ) 
      if (a[ i ] + b[ i ]!= 0)
           n = b[ i ] * 100 / ( a[ i ] + b[ i ] );
      else
           //assign a number to n for this situation 
      percentage [ i ] = ( int ) Math.round( n );
      out.print( percentage[ i ] );
 

但从逻辑上讲,您不应该将数字除以零。那么也许你必须更正你的算法。

【讨论】:

如果您查看我的答案,他的问题远不止是偶尔让a[i] + b[i] 工作为零。实际上,如果我正确理解程序的目的,a[i] + b[i] 应该永远为零。

以上是关于Java异常如何解决的主要内容,如果未能解决你的问题,请参考以下文章

如何解决线程“main”中的异常,java.lang.ArithmeticException:/为零? [关闭]

如何解决 java.net.SocketException:使用 selenium 的 java 中的连接重置异常?

百度问问java如何判断对象是不是为空时,报空指针异常,如何解决?

Java:如何解决 Hibernate 查询语言中的类未映射异常?

如何解决 java.lang.ClassNotFoundException: org.aspectj.lang.ProceedingJoinPoint 异常?

如何解决 java 中的错误 org.omg.CORBA.BAD_OPERATION 异常?