Java 是否可以将try块内部的变量返回到类的主作用域?

Java 是否可以将try块内部的变量返回到类的主作用域?,java,Java,我正在尝试处理Java的错误处理。有没有可能让小的try/catch块做一件事,然后将其操作结果返回到主作用域 似乎所有东西都必须进入try块内部,这似乎有点奇怪 我已经设置了以下测试: public class test { public static void main(String[] args) { System.out.println(0-10); int guess; try { guess = 5;

我正在尝试处理Java的错误处理。有没有可能让小的try/catch块做一件事,然后将其操作结果返回到主作用域

似乎所有东西都必须进入try块内部,这似乎有点奇怪

我已经设置了以下测试:

public class test {
    public static void main(String[] args) {
        System.out.println(0-10);
        int guess;
        try {
            guess = 5;
        }
        catch(Exception ex) {
            System.out.println("bugger");
        }
        System.out.println(guess);
    }
}

举个例子,我声明了一个变量,然后在try块内给它赋值,但它似乎只存在于try块内。尝试在try之外打印会导致错误。有没有办法把信息传递出去

这会导致一个错误,因为编译器在程序结束时试图打印时无法知道
guess
是否已初始化。如果在
try
块中抛出异常,并且
guess
从未分配给任何对象,该怎么办?必须首先在开始时将其指定给某个默认值,例如,
int guess=0

它会导致错误,因为编译器无法知道在程序结束时尝试打印时是否已初始化
guess
。如果在
try
块中抛出异常,并且
guess
从未分配给任何对象,该怎么办?您必须首先在开始时将其分配给某个默认值,例如,使用现有代码将其分配给
int guess=0

,如果您试图在try块之外访问
guess
变量,编译器会告诉您:“
guess
变量可能未初始化”

解决方案:直接在try块外部指定值,如下所示:

int guess = 5;
但我想这样做会让你的尝试/捕获毫无用处

因此,根据您在示例中真正期望的内容,您可以(例如)简单地将其初始化为0

public class test {
    public static void main(String[] args) {
        System.out.println(0-10);
        int guess = 0;
        try {
            guess = 5;
        }
        catch(Exception ex) {
            System.out.println("bugger");
        }
        System.out.println(guess);
    }
}

对于现有代码,如果试图访问try块之外的
guess
变量,编译器会抱怨说:“
guess
变量可能未初始化”

解决方案:直接在try块外部指定值,如下所示:

int guess = 5;
但我想这样做会让你的尝试/捕获毫无用处

因此,根据您在示例中真正期望的内容,您可以(例如)简单地将其初始化为0

public class test {
    public static void main(String[] args) {
        System.out.println(0-10);
        int guess = 0;
        try {
            guess = 5;
        }
        catch(Exception ex) {
            System.out.println("bugger");
        }
        System.out.println(guess);
    }
}

根据定义,不能确保try-catch块完全执行。因此,编译器不知道
guess
已被设置为
5
,即使它显然会被设置为
5。因此,由于局部字段在使用之前必须初始化,编译器不知道
guess
肯定会被赋值

要解决这个问题,您只需将
guess
设置为默认值,以便编译器知道它已初始化

//...
int guess = 0;
try {
    guess = 5;
}
//...

根据定义,不能确保try-catch块完全执行。因此,编译器不知道
guess
已被设置为
5
,即使它显然会被设置为
5。因此,由于局部字段在使用之前必须初始化,编译器不知道
guess
肯定会被赋值

要解决这个问题,您只需将
guess
设置为默认值,以便编译器知道它已初始化

//...
int guess = 0;
try {
    guess = 5;
}
//...

从概念上讲,如果操纵变量guess可能会由于错误而引发异常,那么在相应的catch块中捕获它之后继续操纵它是没有意义的

如果操纵guess不会触发任何类型的异常,只需在try块之外处理它,您就可以了


您提供的代码是不明确的,因为如果引发并捕获异常,程序将不会有一致的值。

从概念上讲,如果操作变量guess可能由于错误引发异常,则在相应的catch块中捕获异常后继续操作它是没有意义的

如果操纵guess不会触发任何类型的异常,只需在try块之外处理它,您就可以了


您提供的代码模棱两可,因为如果引发并捕获异常,程序将不会有一致的值。

@Zack碰巧遇到了我们中最好的:-)很高兴我能帮忙。@Zack碰巧遇到了我们中最好的:-)很高兴我能帮忙。