Java的"may not initialized variable"是什么样的错误/异常?



我刚刚学习了Java中的异常,但我想知道"可能未初始化变量"是错误还是异常或其他什么?

我试图将其视为异常,我在记事本++中编写代码,如下所示:

public class Demo{
public static void main(String[] args) throws Exception{
int a ;
System.out.println(a);
}
}

它不起作用,我仍然无法使用"javac Demo.java"编译它。它表明它不是例外。

我以前没有学过"错误",但是我在API中搜索了"错误",检查了Error的子类,我仍然不知道答案。

有人可以帮助我吗? 非常感谢。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

好吧,我知道我应该给 a 赋一个值,我想知道的是我问的问题。

我在梁漱漱的书中学到了那句话"局部变量必须声明并赋值才能使用",请不要用那句话来回答我,这不是我问题的答案,谢谢。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

让我们看另一个演示。这是关于编译异常的。

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"时,我无法编译它。在我添加"抛出 ParseException"后,我可以编译它,尽管它仍然无法运行。

但是当我在第一个演示中添加"抛出异常"时,我仍然无法编译它。这才是让我感到困惑的真正一点。

"这是一个编译错误,不是例外",对不起,我不知道如何在stackoverflow中与您交谈,但我认为您是对的,您能否给我一些关键字,以便我可以在google或stackoverflow中进行搜索,或者我应该花一些时间学习编译器?

在像java这样的编译语言中,我们使用术语编译时间和运行时

编译时是编译器可能抛出错误的地方,如果它发现代码以某种方式错误。这可能是语法错误的,或者,例如,如果变量在使用时未初始化。基本上,编译器会在程序运行之前找到所有已知出错的内容。

在运行时(即运行程序时(,将引发异常。例外可能是零除法(零来自变量(之类的东西,编译器在运行时之前无法知道。

您可以(我建议您这样做(在此处阅读有关运行时和编译时间的更多信息:运行时与编译时

只是作为一个快速的旁注。Azhy 的回答中他说代码中的 a 是 0 是错误的。

如果"a"变量是一个字段(类中变量的花哨词(,那么是的,它会默认为 0,但由于它是一个局部变量(方法中的一个变量(在您的情况下,main(( 方法((,它只是没有值,因此无法打印。


在第二个示例中,编译器看到您在示例的第 6 行调用的 parse(( 方法被声明为抛出一个名为 ParseException 的异常。parse 方法的声明可能如下所示:

public Date parse() throws ParseException

这意味着,当编译器看到对 parse 的调用时,它会"让我检查一下 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。

第二个示例对初学者不是很友好,因为它同时包含运行时异常和由于缺少运行时异常的异常处理而引发的编译时错误。

异常是在运行时发生的事情(通常是不寻常的(。

必须处理经过检查的异常,因为它们可能随时发生(例如IOError(。

还有一些未经检查的异常在"干净"程序中不会发生(例如,如果您在使用它们之前检查所有引用,则不会得到 NullPointerException;如果您仔细检查所有数组索引,则不会收到 OutOfBounds 错误等(。

这两种情况都发生在运行时。

您在这里遇到的是在编译时可见的错误,即变量可能未初始化。编译器不能容忍这种情况,程序不会编译,因此它无法运行,并且如前所述,运行时是异常变得相关的时间,因此您不能将其视为异常。

最新更新