变量在构造函数中定义但抛出 NullPointerexception
Variable is defined in constructor but throwing NullPointerexception
我是 Java 的新手,我正在练习 Strings 但是当我 运行 这会抛出 NullPointeException
我已经定义了一个构造函数,其值为 String s1,stopCodon,startCodon。
它采用 s1 的值但不采用 stopCodon,startCodon
当我将值放入实例变量时它工作正常
请稍微解释一下,以便对我有所帮助...
/* package codechef; // don't place package name! */
import java.util.*;
import java.lang.*;
import java.io.*;
/* Name of the class has to be "Main" only if the class is public. */
class Codechef
{
String s1;
String startCodon;
String stopCodon;
public static void main (String[] args) throws java.lang.Exception
{
// your code goes here
//String s1;
//String startCodon;
//String stopCodon;
Codechef test1 = new Codechef();
test1.testSimpleGene();
}
public void testSimpleGene(){
System.out.println("Gene Strand is = " + s1);
System.out.println("Gene1 is = " + findSimpleGene(s1));
System.out.println("Gene2 is = " + findSimpleGene(s1,startCodon,stopCodon));
}
private String findSimpleGene(String dna,String x,String y){
String dnaResult = "";
int startIndex = dna.toUpperCase().indexOf(x);
if (startIndex == -1){
return "";
}
int stopIndex = dna.toUpperCase().indexOf(y,startIndex+3);
if (stopIndex == -1){
return "";
}
//System.out.println(startIndex +" Part2 "+ (stopIndex));
if((stopIndex - startIndex)%3 == 0){
dnaResult = dna.substring(startIndex,stopIndex+3);
}
return dnaResult;
}
public String findSimpleGene(String dna){
String dnaResult = "";
int startIndex = dna.indexOf(startCodon);
if (startIndex == -1){
return "";
}
int stopIndex = dna.indexOf(stopCodon,startIndex+3);
if (stopIndex == -1){
return "";
}
//System.out.println(startIndex +" "+ (stopIndex));
if((stopIndex - startIndex)%3 == 0){
dnaResult = dna.substring(startIndex,stopIndex+3);
}
return dnaResult;
}
Codechef(){
String s1 = "taaatg";
String startCodon = "TAA";
String stopCodon = "ATG";
}
}
错误
at Codechef.findSimpleGene(Main.java:45)
at Codechef.testSimpleGene(Main.java:24)
at Codechef.main(Main.java:20)```
将构造函数更改为如下所示。
public Codechef(){
s1 = "taaatg";
startCodon = "TAA";
stopCodon = "ATG";
}
通过在每行的开头使用单词 String
,您实际上是在构造函数中声明了局部变量。您不希望这样,因为您希望使用对象中的字段,而不是其他变量。
如评论中所述,您正在构造函数中定义新的局部变量,这些变量恰好与 class 字段变量同名。
在您的构造函数中,您应该分配 class 字段的值(s1
、startCodon
、stopCodon
):
Codechef(){
s1 = "taaatg";
startCodon = "TAA";
stopCodon = "ATG";
}
但是,如果存在与字段变量(对象的属性)同名的局部变量,则可以引用该字段变量关键字 this
:
Codechef(){
String s1 = "local variable";
this.s1 = "taaatg";
startCodon = "TAA";
stopCodon = "ATG";
}
我是 Java 的新手,我正在练习 Strings 但是当我 运行 这会抛出 NullPointeException
我已经定义了一个构造函数,其值为 String s1,stopCodon,startCodon。
它采用 s1 的值但不采用 stopCodon,startCodon
当我将值放入实例变量时它工作正常
请稍微解释一下,以便对我有所帮助...
/* package codechef; // don't place package name! */
import java.util.*;
import java.lang.*;
import java.io.*;
/* Name of the class has to be "Main" only if the class is public. */
class Codechef
{
String s1;
String startCodon;
String stopCodon;
public static void main (String[] args) throws java.lang.Exception
{
// your code goes here
//String s1;
//String startCodon;
//String stopCodon;
Codechef test1 = new Codechef();
test1.testSimpleGene();
}
public void testSimpleGene(){
System.out.println("Gene Strand is = " + s1);
System.out.println("Gene1 is = " + findSimpleGene(s1));
System.out.println("Gene2 is = " + findSimpleGene(s1,startCodon,stopCodon));
}
private String findSimpleGene(String dna,String x,String y){
String dnaResult = "";
int startIndex = dna.toUpperCase().indexOf(x);
if (startIndex == -1){
return "";
}
int stopIndex = dna.toUpperCase().indexOf(y,startIndex+3);
if (stopIndex == -1){
return "";
}
//System.out.println(startIndex +" Part2 "+ (stopIndex));
if((stopIndex - startIndex)%3 == 0){
dnaResult = dna.substring(startIndex,stopIndex+3);
}
return dnaResult;
}
public String findSimpleGene(String dna){
String dnaResult = "";
int startIndex = dna.indexOf(startCodon);
if (startIndex == -1){
return "";
}
int stopIndex = dna.indexOf(stopCodon,startIndex+3);
if (stopIndex == -1){
return "";
}
//System.out.println(startIndex +" "+ (stopIndex));
if((stopIndex - startIndex)%3 == 0){
dnaResult = dna.substring(startIndex,stopIndex+3);
}
return dnaResult;
}
Codechef(){
String s1 = "taaatg";
String startCodon = "TAA";
String stopCodon = "ATG";
}
}
错误
at Codechef.findSimpleGene(Main.java:45)
at Codechef.testSimpleGene(Main.java:24)
at Codechef.main(Main.java:20)```
将构造函数更改为如下所示。
public Codechef(){
s1 = "taaatg";
startCodon = "TAA";
stopCodon = "ATG";
}
通过在每行的开头使用单词 String
,您实际上是在构造函数中声明了局部变量。您不希望这样,因为您希望使用对象中的字段,而不是其他变量。
如评论中所述,您正在构造函数中定义新的局部变量,这些变量恰好与 class 字段变量同名。
在您的构造函数中,您应该分配 class 字段的值(s1
、startCodon
、stopCodon
):
Codechef(){
s1 = "taaatg";
startCodon = "TAA";
stopCodon = "ATG";
}
但是,如果存在与字段变量(对象的属性)同名的局部变量,则可以引用该字段变量关键字 this
:
Codechef(){
String s1 = "local variable";
this.s1 = "taaatg";
startCodon = "TAA";
stopCodon = "ATG";
}