我刚刚学习了Java中的异常,但我想知道“可能没有初始化变量”是错误还是异常还是其他什么?
我试图将其视为异常,我在notepad ++中编写代码,如下所示:
public class Demo{
public static void main(String[] args) throws Exception{
int a ;
System.out.println(a);
}
}
它没有用,我仍然无法使用“javac Demo.java”编译它。它表明它不是例外。
我之前没有学过“Error”,但我在API中搜索“Error”,检查Error的子类,我还是不知道答案。
有人可以帮助我吗?非常感谢。
~~~~~~~~~~~~~~~~~~~~~~~
嗯,我知道我应该为a分配一个值,我想知道的是我问的问题。
我学会了这句话“必须声明一个局部变量并在它被使用之前赋值。”在Y.Daniel Liang的书中,请不要用那句话回答我,这不是我的问题的答案,谢谢。
~~~~~~~~~~~~~~~~~~~~~~~
让我们看另一个演示。它是关于编译异常。
public class Demo2{
public static void main(String[] args) throws ParseException {
//public static void main(String[] args){
String str = "1991-0101";
DateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date birthdayDate = sdf.parse(str);
System.out.println(birthdayDate);
}
}
ParseException是一个compileException(它扩展了Exception),当我没有添加“throws ParseException”时,我无法编译它。在我添加“throws ParseException”之后,我可以编译它,虽然它仍然无法运行。
但是当我在第一个Demo中添加“throws Exception”时,我仍然无法编译它。这真是让我感到困惑的一点。
“这是编译错误,不是例外”,抱歉我不知道如何在stackoverflow中与您交谈,但我认为您是对的,您能给我一些关键字,以便我可以在谷歌搜索或stackoverflow,还是我应该花一些时间学习编译器?
答案 0 :(得分:0)
异常是在运行时发生的事情(通常是不常见的)。
有必须处理的已检查异常,因为它们可能随时发生(例如IOError)。
还有一些未经检查的例外情况不会发生在" clean"程序(例如,如果在使用它们之前检查所有引用,则不会获得NullPointerException;如果仔细检查所有数组索引,则不会出现OutOfBounds错误等。)
这些都发生在运行时。
您在此处遇到的错误是在编译时可见的错误,该错误可能未初始化。编译器无法容忍这种情况,并且程序无法编译,因此无法运行,如上所述,运行时是异常变得相关的时间,因此您不能将其视为异常。
答案 1 :(得分:0)
在像java这样的编译语言中,我们使用术语编译时和运行时
编译时间是编译器可能抛出错误的地方,如果它发现代码错误的话。这可能在语法上是错误的,或者,例如,如果在使用时未初始化变量。基本上,编译器会在程序运行之前找到可能出错的所有内容。
在运行时(意味着运行程序时),抛出异常。例外可能是零分割(零来自变量),编译器在运行之前无法知道。
您可以(我建议您这样做)在此处阅读有关运行时和编译时间的更多信息:Runtime vs Compile time
就像一个快速的旁注。 Azhy的回答中他说你的代码中的a是0是错误的。
如果'a'变量是一个字段(类中变量的奇特单词),那么它是真的,那么它将默认为0,但因为它是局部变量(方法中的变量) (在你的情况下,main()方法)),它只是没有值,因此不能打印。
在第二个示例中,编译器会看到您在示例的第6行调用的parse()方法被声明为抛出一个名为ParseException的异常。解析方法的声明可能如下所示:
public Date parse() throws ParseException
这意味着,当编译器看到解析调用时,它会“让我只检查parse()的作用”,然后发现它有机会抛出ParseException。现在编译器将抛出一个错误,除非你处理抛出ParseException的可能性。这可以通过使用try / catch包围调用来完成,如下所示:
public class Demo2{
public static void main(String[] args) {
String str = "1991-0101";
DateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
//pulled birthdayDae out of the try/catch, so it is accesible to the println later
Date birthdayDate;
try {
// tries to do the parse
birthdayDate = sdf.parse(str);
}catch(ParseException e){
// if it fails this will be executed
}
System.out.println(birthdayDate);
}
}
或者声明main可能像你一样抛出ParseException。
第二个示例对初学者不友好,因为它包含运行时异常和由于缺少运行时异常的异常处理而引发的编译时错误。