开发小学生乘法学习程序时遇静态上下文引用非静态变量错误求助
解决"non-static variable cannot be referenced from a static context"错误
首先得把这个错误的根源说清楚:你在静态方法(比如main方法)里直接调用了一个非静态的成员变量(比如你的randomNumbers)。静态成员属于整个类,不用创建对象就能用;而非静态成员是绑定到每个对象实例的,必须先new出对象才能访问。这俩的生命周期完全不一样,所以静态上下文里直接碰非静态变量就会触发这个报错。
针对你的小学生乘法学习程序,给你两种最实用的解决方案:
方案1:把SecureRandom变量声明为static
既然你是在静态方法里用它,直接把变量改成静态的就行,这样它就属于类本身,静态方法就能直接调用了。示例代码如下:
import java.security.SecureRandom; import java.util.Scanner; public class MultiplicationQuiz { // 将SecureRandom声明为static类变量 private static final SecureRandom randomNumbers = new SecureRandom(); public static void main(String[] args) { Scanner input = new Scanner(System.in); generateQuestion(input); } public static void generateQuestion(Scanner input) { // 现在可以直接用randomNumbers生成1-9的随机数 int num1 = 1 + randomNumbers.nextInt(9); int num2 = 1 + randomNumbers.nextInt(9); System.out.printf("%d乘%d等于多少?", num1, num2); int userAnswer = input.nextInt(); // 答案校验逻辑 if (userAnswer == num1 * num2) { System.out.println("答对啦!你真棒~"); } else { System.out.printf("答错了哦,正确答案是%d%n", num1 * num2); } } }
方案2:在静态方法中创建类的实例,再访问非静态变量
如果你不想把变量改成静态的(比如以后要扩展多个独立的随机数生成器场景),那就在静态方法里先new出类的对象,再通过对象来调用非静态变量。示例如下:
import java.security.SecureRandom; import java.util.Scanner; public class MultiplicationQuiz { // 保持非静态成员变量 private final SecureRandom randomNumbers = new SecureRandom(); public static void main(String[] args) { Scanner input = new Scanner(System.in); // 创建类的实例 MultiplicationQuiz quiz = new MultiplicationQuiz(); quiz.generateQuestion(input); } // 把方法改成非静态,绑定到对象实例 public void generateQuestion(Scanner input) { int num1 = 1 + randomNumbers.nextInt(9); int num2 = 1 + randomNumbers.nextInt(9); System.out.printf("%d乘%d等于多少?", num1, num2); int userAnswer = input.nextInt(); if (userAnswer == num1 * num2) { System.out.println("答对啦!你真棒~"); } else { System.out.printf("答错了哦,正确答案是%d%n", num1 * num2); } } }
怎么选方案?
- 如果你的程序只需要一个
SecureRandom实例(大部分小工具场景都是这样),方案1更简单直接。 - 如果以后可能需要多个独立的随机数生成器(比如不同的测验实例用不同的随机种子),方案2更灵活。
两种方案都能完美解决你遇到的错误,按需选就行~
内容的提问来源于stack exchange,提问作者Nikki Fairley
相关产品推荐
相关产品推荐

