Доступ к переменной внутри try catch - PullRequest
6 голосов
/ 04 марта 2012

Я получаю сообщение об ошибке компиляции в возвращаемой строке 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 ]

18 голосов
/ 04 марта 2012

Основная проблема с вашим кодом состоит в том, что объект Font находится в области видимости только во время блока try, поэтому он больше не доступен в вашем операторе return в конце метода.Два варианта:

Переместите объявление переменной за пределы блока try:

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

}
return menuFont;

Или сделайте return Font.creatFont(...) внутри попытки, таким образом, избегая необходимости переменной в первую очередьочевидно, return null в конце метода).

4 голосов
/ 04 марта 2012

Область действия переменной 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.

3 голосов
/ 04 марта 2012

Это потому, что menuFont не существует в рамках метода getFont. Переменные, определенные вне вашей текущей области / блока (пара фигурных скобок), доступны, в то время как переменные, определенные во вложенном блоке, недоступны. Вы можете исправить это одним из двух способов:

  • Переместите объявление menuFont выше try (в пределах getFont). Поскольку вы ожидаете исключения в Font.createFont, оставьте этот код внутри блока try.
  • Перемещение оператора return внутрь блока try.

Пожалуйста, смотрите ответы на Наконец, всегда ли выполняется на Java? , чтобы узнать больше тонкостей о try / catch / finally.

3 голосов
/ 04 марта 2012

вы должны объявить переменную 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;
    }

}
2 голосов
/ 04 марта 2012

Это из-за области действия вашей переменной 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
2 голосов
/ 04 марта 2012

menuFont не существует вне блока try, что ваш компилятор пытается вам сказать.Вместо этого объявите его перед блоком try, а затем попытайтесь присвоить ему значение внутри блока try:

Font menuFont;

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

return menuFont;
0 голосов
/ 04 марта 2012
0 голосов
/ 04 марта 2012

Как правило, я бы сделал следующее:

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 везде, где вы вызываете этот метод.

...