在try catch中访问变量

时间:2012-03-04 00:04:23

标签: java try-catch

我一直在返回menuFont行上遇到编译错误,它说没有变量menuFont。有人可以告诉你如何解决这个问题。

import java.awt.Font;
import java.awt.FontFormatException;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;


public class loadFiles {
Font getFont(){
            try {
                Font menuFont = Font.createFont( Font.TRUETYPE_FONT, new FileInputStream("font.ttf"));

            } catch (FileNotFoundException e) {
                System.out.println("Cant find file.");
                e.printStackTrace();
            } catch (FontFormatException e) {
                System.out.println("Wrong file type.");
                e.printStackTrace();
            } catch (IOException e) {
                System.out.println("Unknown error.");
                e.printStackTrace();
            }
            return menuFont;
    }
}

8 个答案:

答案 0 :(得分:18)

代码的基本问题是Font对象仅在try块的持续时间范围内,因此在方法结束时的return语句中不再可用。两个选项:

将变量声明移到try块之外:

Font menuFont = null;
try {
    menuFont = Font.createFont(...);
}
catch (...) {

}
return menuFont;

或者,在try中执行return Font.creatFont(...),从而避免首先需要变量(显然,在方法结束时return null)。

答案 1 :(得分:4)

menuFont变量范围位于try块内。将变量移到其外部。 类似的东西:

  Font getFont(){
        Font menuFont = null; 
        try {
            menuFont = Font.createFont( Font.TRUETYPE_FONT, new FileInputStream("font.ttf"));

        } catch (FileNotFoundException e) {
            System.out.println("Cant find file.");
            e.printStackTrace();
        } catch (FontFormatException e) {
            System.out.println("Wrong file type.");
            e.printStackTrace();
        } catch (IOException e) {
            System.out.println("Unknown error.");
            e.printStackTrace();
        }
        return menuFont;
  }

请注意,如果发生异常,此方法将返回null字体。

答案 2 :(得分:3)

你必须在外面声明变量menuFont ......

import java.awt.Font;
import java.awt.FontFormatException;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

public class loadFiles {
    Font getFont(){
        Font menuFont = null;
        try {
            menuFont = Font.createFont( Font.TRUETYPE_FONT, new FileInputStream("font.ttf"));

        } catch (FileNotFoundException e) {
            System.out.println("Cant find file.");
            e.printStackTrace();
        } catch (FontFormatException e) {
            System.out.println("Wrong file type.");
            e.printStackTrace();
        } catch (IOException e) {
            System.out.println("Unknown error.");
            e.printStackTrace();
        }
        return menuFont;
    }

}

答案 3 :(得分:3)

这是因为menuFont不存在于getFont方法的范围内。在当前范围/块(花括号对)之外定义的变量是可用的,而在嵌套块中定义的变量则不可用。您可以通过以下两种方式之一进行更正:

  • menuFont的声明移至try之上(在getFont范围内)。因为您预计Font.createFont中存在异常,请将该代码保留在try块中。
  • return语句移至try块内。

请参阅Does finally always execute in Java?的答案,了解有关try / catch / finally的更多细微之处。

答案 4 :(得分:2)

menuFonttry块之外不存在,这是您的编译器试图告诉您的。相反,在try块之前声明它,然后尝试在try块内为其赋值:

Font menuFont;

try {
   Font menuFont = ...
}
...

return menuFont;

答案 5 :(得分:2)

这是因为menuFont变量的范围。你在try内声明它,这意味着它不能从任何地方访问,而是在这两个大括号内。如果您希望能够在catchtry之外的任何位置访问它,请将您的代码更改为以下内容:

Font menuFont = null;
try {
    menuFont = Font.createFont( Font.TRUETYPE_FONT, new FileInputStream("font.ttf"));
} catch (FileNotFoundException e) {
    // you can access menuFont here (too)
}
//...
return menuFont; // <-- note: can be null here

答案 6 :(得分:0)

一般来说,我会做以下事情:

import java.awt.Font;
import java.awt.FontFormatException;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;


public class loadFiles {
Font menuFont = null;
Font getFont(){
            try {
                menuFont = Font.createFont( Font.TRUETYPE_FONT, new FileInputStream("font.ttf"));

            } catch (FileNotFoundException e) {
                System.out.println("Cant find file.");
                e.printStackTrace();
            } catch (FontFormatException e) {
                System.out.println("Wrong file type.");
                e.printStackTrace();
            } catch (IOException e) {
                System.out.println("Unknown error.");
                e.printStackTrace();
            }
    }
    return menuFont; // could potentially be null!
}

并在您调用此方法的任何地方检查null

答案 7 :(得分:0)