Java 如何在方法外部访问字符串

Java 如何在方法外部访问字符串,java,android,parse-platform,Java,Android,Parse Platform,我试图访问解析查询外部的字符串,它在查询外部不起作用,但在查询内部起作用。 我声明了全局变量并尝试访问它,但它仍然不工作,它返回的不是null字符串 我是Java和Android新手,所以如果这是一个愚蠢的问题,请原谅我 任何帮助都将不胜感激 public class ActivityQuiz extends AppCompatActivity { ArrayList<String> answerList = new ArrayList<>(); int c=0;

我试图访问解析查询外部的字符串,它在查询外部不起作用,但在查询内部起作用。 我声明了全局变量并尝试访问它,但它仍然不工作,它返回的不是null字符串

我是Java和Android新手,所以如果这是一个愚蠢的问题,请原谅我

任何帮助都将不胜感激

public class ActivityQuiz extends AppCompatActivity {

ArrayList<String> answerList = new ArrayList<>();

int c=0;

String Answer = "correct";
String selectedOption;
public static String  checkAns;


@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_quiz);


    ParseQuery<ParseObject> query = ParseQuery.getQuery("Question");
    query.findInBackground(new FindCallback<ParseObject>() {
        @Override
        public void done(List<ParseObject> questions, ParseException e) {
            if (e == null) {
                for (ParseObject question : questions) {                        
                    answerList.add(question.getString(Answer));
                     checkAns = getanswerList.get(c);
                     Log.d("String check",""+checkAns); //here it's working
                }

            } else {
                e.printStackTrace();
            }
        }

    });

    try{

    String checkanswer = checkAns ; // here returns null instead of string
    Log.d("String checkans",""+checkanswer);}
    catch (Exception e)
    {
        e.printStackTrace();
        Log.d("Error", "Error, Not Working");
    }
    }
公共类活动测验扩展了AppCompatActivity{
ArrayList answerList=新的ArrayList();
int c=0;
字符串Answer=“correct”;
字符串选择选项;
公共静态字符串校验;
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity\u测验);
ParseQuery=ParseQuery.getQuery(“问题”);
findInBackground(新的FindCallback(){
@凌驾
公共作废完成(列出问题,e){
如果(e==null){
对于(对象问题:问题){
add(question.getString(Answer));
checkAns=getanswerList.get(c);
Log.d(“字符串检查”,“”+checkAns);//它在这里工作
}
}否则{
e、 printStackTrace();
}
}
});
试一试{
String checkanswer=checkAns;//此处返回null而不是String
Log.d(“字符串checkans”,“”+checkanswer);}
捕获(例外e)
{
e、 printStackTrace();
Log.d(“错误”、“错误、不工作”);
}
}

有一个非常简单的问题。首先,您在点击API(在后台)后从数据中获取
checkAns
的值。因此,如果数据来自API,它将是非空的

在后面的部分中,由于API响应需要时间,
try catch
块将在设置
checkAns
中的值之前执行,因此
checkAns
等于初始化值,即
null


理想情况下,您应该只在
done()
方法中使用
checkAns
的值。

这是一个非常简单的问题。首先,您在点击API后(在后台)从数据中获取
checkAns
的值。因此,如果数据来自API,它将是非空的

在后面的部分中,由于API响应需要时间,
try catch
块将在设置
checkAns
中的值之前执行,因此
checkAns
等于初始化值,即
null


理想情况下,您应该仅在
done()
方法中使用
checkAns
的值。

ParseQuery中添加您的try-catch代码,如下所示:

ParseQuery<ParseObject> query = ParseQuery.getQuery("Question");
        query.findInBackground(new FindCallback<ParseObject>() {
            @Override
            public void done(List<ParseObject> questions, ParseException e) {
                if (e == null) {
                    for (ParseObject question : questions) {                        
                        answerList.add(question.getString(Answer));
                         checkAns = getanswerList.get(c);
                         Log.d("String check",""+checkAns); //here it's working

                         // ....Add your try catch code.....
                         try{
                              String checkanswer = checkAns ; // also working well
                              Log.d("String checkans",""+checkanswer);}
                              catch (Exception e)
                              {
                                  e.printStackTrace();
                                  Log.d("Error", "Error, Not Working");
                              }
                           }

                } else {
                    e.printStackTrace();
                }
            }

        });
ParseQuery query=ParseQuery.getQuery(“问题”);
findInBackground(新的FindCallback(){
@凌驾
公共作废完成(列出问题,e){
如果(e==null){
对于(对象问题:问题){
add(question.getString(Answer));
checkAns=getanswerList.get(c);
Log.d(“字符串检查”,“”+checkAns);//它在这里工作
//..添加您的try-catch代码。。。。。
试一试{
String checkanswer=checkAns;//工作正常
Log.d(“字符串checkans”,“”+checkanswer);}
捕获(例外e)
{
e、 printStackTrace();
Log.d(“错误”、“错误、不工作”);
}
}
}否则{
e、 printStackTrace();
}
}
});

将您的try-catch代码添加到ParseQuery中,如下所示:

ParseQuery<ParseObject> query = ParseQuery.getQuery("Question");
        query.findInBackground(new FindCallback<ParseObject>() {
            @Override
            public void done(List<ParseObject> questions, ParseException e) {
                if (e == null) {
                    for (ParseObject question : questions) {                        
                        answerList.add(question.getString(Answer));
                         checkAns = getanswerList.get(c);
                         Log.d("String check",""+checkAns); //here it's working

                         // ....Add your try catch code.....
                         try{
                              String checkanswer = checkAns ; // also working well
                              Log.d("String checkans",""+checkanswer);}
                              catch (Exception e)
                              {
                                  e.printStackTrace();
                                  Log.d("Error", "Error, Not Working");
                              }
                           }

                } else {
                    e.printStackTrace();
                }
            }

        });
ParseQuery query=ParseQuery.getQuery(“问题”);
findInBackground(新的FindCallback(){
@凌驾
公共作废完成(列出问题,e){
如果(e==null){
对于(对象问题:问题){
add(question.getString(Answer));
checkAns=getanswerList.get(c);
Log.d(“字符串检查”,“”+checkAns);//它在这里工作
//..添加您的try-catch代码。。。。。
试一试{
String checkanswer=checkAns;//工作正常
Log.d(“字符串checkans”,“”+checkanswer);}
捕获(例外e)
{
e、 printStackTrace();
Log.d(“错误”、“错误、不工作”);
}
}
}否则{
e、 printStackTrace();
}
}
});

这是异步函数的正常行为

在执行try/catch块时,checkanswer仍然为null,因为执行查询需要时间。一旦执行了done(),您将获得字符串


如果必须在该块中输入值,则可以休眠一两秒钟并检查checkanswer是否不再为null。请小心休眠,因为如果在主线程中使用它们,它们将挂起程序,这是异步函数的正常行为

在执行try/catch块时,checkanswer仍然为null,因为执行查询需要时间。一旦执行了done(),您将获得字符串

如果必须在该块中输入值,则可以休眠一两秒钟,然后检查checkanswer是否不再为null。请小心休眠,因为如果您执行此操作,它们将挂起您的程序
List<ParseObject> questions = query.find();

    for (ParseObject question : questions) {
      answerList.add(question.getString(Answer));
      Log.d("String checkans",""+checkanswer);
    }
    String checkanswer = getanswerList.get(c);