我一直在返回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;
}
}
答案 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)
menuFont
在try
块之外不存在,这是您的编译器试图告诉您的。相反,在try
块之前声明它,然后尝试在try
块内为其赋值:
Font menuFont;
try {
Font menuFont = ...
}
...
return menuFont;
答案 5 :(得分:2)
这是因为menuFont
变量的范围。你在try
内声明它,这意味着它不能从任何地方访问,而是在这两个大括号内。如果您希望能够在catch
或try
之外的任何位置访问它,请将您的代码更改为以下内容:
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)