Java 为什么我必须在这个程序中初始化a和b?

Java 为什么我必须在这个程序中初始化a和b?,java,scope,Java,Scope,在这个程序中,为什么我必须初始化a和b,因为它们的范围不受限制,但我不能在d=a+b行上使用它们 import java.util.Scanner; class DivAndSum { public static void main(String[] args) { int a = 0, b = 0; Scanner kb = new Scanner(System.in); try { a = kb.nextInt(

在这个程序中,为什么我必须初始化
a
b
,因为它们的范围不受限制,但我不能在
d=a+b
行上使用它们

import java.util.Scanner;
class DivAndSum {
    public static void main(String[] args) {
        int a = 0, b = 0;
        Scanner kb = new Scanner(System.in);
        try {
            a = kb.nextInt();
            b = kb.nextInt();
            int c = a / b;
            System.out.println("Div=" + c);
        } catch (ArithematicException e) {
            System.out.println("Please Enter a non zero denominator");
        } catch (InputMismatchException e) {
            System.out.println("Please Enter integers only");
            System.exit(0);
        }
        int d = a + b;
        System.out.println("Sum=" + d);
    }
}
下面的程序编译得很好:

import java.util.Scanner;
class DivAndSum {
    public static void main(String[] args) {
        int a,b,d;
        Scanner kb = new Scanner(System.in);
            a = kb.nextInt();
            b = kb.nextInt();
            d = a + b;
            System.out.println("Sum=" + d);}}

如果你说的是
inta=0,b=0然后
a
b
都是局部变量,必须初始化局部变量

仅类级和实例级变量不需要初始化

如果不想初始化,请参阅下面的代码

import java.util.Scanner;
class DivAndSum {
int a,b; // here a and b are instance variables so no need to be initialized. Both will have value 0 which is default
    public static void main(String[] args) {
       // int a = 0, b = 0; a and b are loca variables so both should be initialized
        Scanner kb = new Scanner(System.in);
        try {
            a = kb.nextInt();
            b = kb.nextInt();
            int c = a / b;
            System.out.println("Div=" + c);
        } catch (ArithematicException e) {
            System.out.println("Please Enter a non zero denominator");
        } catch (InputMismatchException e) {
            System.out.println("Please Enter integers only");
            System.exit(0);
        }
        int d = a + b;
        System.out.println("Sum=" + d);
    }
}

如果你说的是
inta=0,b=0然后
a
b
都是局部变量,必须初始化局部变量

仅类级和实例级变量不需要初始化

如果不想初始化,请参阅下面的代码

import java.util.Scanner;
class DivAndSum {
int a,b; // here a and b are instance variables so no need to be initialized. Both will have value 0 which is default
    public static void main(String[] args) {
       // int a = 0, b = 0; a and b are loca variables so both should be initialized
        Scanner kb = new Scanner(System.in);
        try {
            a = kb.nextInt();
            b = kb.nextInt();
            int c = a / b;
            System.out.println("Div=" + c);
        } catch (ArithematicException e) {
            System.out.println("Please Enter a non zero denominator");
        } catch (InputMismatchException e) {
            System.out.println("Please Enter integers only");
            System.exit(0);
        }
        int d = a + b;
        System.out.println("Sum=" + d);
    }
}

如果不初始化它们(即用
int a,b;
替换
int a,b;
),则使用用户输入初始化它们的try块可能无法初始化它们(例如,如果用户输入字符串而不是int,
kb.nextInt()
将引发异常)


在这种情况下,它们在
intd=a+b行没有值。因此必须初始化它们。

如果不初始化它们(即用
int a,b;
替换
int a,b;
),则使用用户输入初始化它们的try块可能无法初始化它们(例如,如果用户输入字符串而不是int,
kb.nextInt()
将引发异常)


在这种情况下,它们在
intd=a+b行没有值。因此,必须对它们进行初始化。

如果在try catch中分配变量a出错,无论原因如何,都不能初始化,然后对未初始化的值进行数学运算,这一点都不好

因此,您的IDE中的complining是

尝试声明并初始化ab

int a, b;
a=0;
b=0;
try {
...

如果在try catch中分配变量a出错,无论原因如何,都不会初始化,之后将对未初始化的值进行数学运算,这一点都不好

因此,您的IDE中的complining是

尝试声明并初始化ab

int a, b;
a=0;
b=0;
try {
...


为什么你认为你不应该初始化它们?如果在分配异常之前抛出异常,您希望发生什么?(例如,想象一下如果
nextInt()
抛出了一个
算术异常
?请参考这个现有的问题:为什么您认为不应该初始化它们?如果在分配它们之前抛出异常,您会期望发生什么?(例如,想象一下如果
nextInt())
抛出了一个
算术异常
?请参考这个现有的问题:但是如果在初始化“a”时出错,那么catch无法处理,那么程序不会在该异常时终止吗?您只捕获了这两个异常:arithermaticeexception inputmatchexception,甚至在那些catch部分中r a和b都是初始化的…但是如果在初始化“a”时出现错误,catch无法处理,那么程序不会在该异常时终止吗?您只捕获了这两个异常:arithermaticeexception inputmatchexception,甚至,在这些catch部分中,a和b都没有初始化…是的,那将是inputmatch我猜是chException,如果该异常发生,程序将终止。是的,我猜是inputmatchxception,如果该异常发生,程序将终止。请参阅第二个程序:a和b a都是本地的,其中一个没有给出编译错误。@shryahsharma第二个程序不会编译,因为defining d两次。更改了它,但是,为什么第二个运行而不是第一个。@Shryashharma你说第二个运行而不是第一个是什么意思?第一个。谢谢你花时间回复,我只想知道在第一个程序中,行“d=a+b”与“a”和“b”在同一范围内,与第二个代码中的代码相同,但在第一个代码中,我必须初始化它们,因为我知道它们肯定会被Scanner初始化,否则程序将由于异常而终止,或者该异常将被处理,然后通过以下方式终止:“System.exit(0)”。请看第二个程序:a和b a都是本地的,其中一个没有编译错误。@Shryashharma第二个程序不会编译,因为定义了两次d。更改了它,但是,为什么第二个程序运行而不是第一个程序。@Shryashharma第二个程序运行而不是第一个程序是什么意思?第一个。谢谢你的帮助花时间回答,我只想知道在第一个程序中,行“d=a+b”与“a”和“b”在同一范围内,与第二个代码中的代码相同,但在第一个代码中,我必须初始化它们,因为我知道它们肯定会被Scanner初始化,否则程序将由于异常而终止,或者该异常将被处理,然后通过“System.exit(0)”终止。