Исключение нулевого указателя - это индикатор того, что вы используете объект, не инициализируя его.
Например, ниже - класс ученика, который будет использовать его в нашем коде.
public class Student {
private int id;
public int getId() {
return this.id;
}
public setId(int newId) {
this.id = newId;
}
}
Приведенный ниже код дает вам исключение с нулевым указателем.
public class School {
Student obj_Student;
public School() {
try {
obj_Student.getId();
}
catch(Exception e) {
System.out.println("Null Pointer ");
}
}
}
Поскольку вы используете Obj_Student
, но вы забыли инициализировать его, как в правильном коде, показанном ниже:
public class School {
Student obj_Student;
public School() {
try {
obj_Student = new Student();
obj_Student.setId(12);
obj_Student.getId();
}
catch(Exception e) {
System.out.println("Null Pointer ");
}
}
}
Вы можете использовать Apocal's Commons-lang's ToStringBuilder.reflectionToString
Конечно, отражение медленное, поэтому используйте это только с помощью тестового кода. для нормального использования, используйте меню «Источник» eclipse -> сгенерируйте toString () (или intellij сгенерируйте toString ()), что дает вам приличную строку.
У вас есть два варианта. Простым является просто переопределение функции toString
для вашего класса. Я не понимаю, почему вы этого не делаете. В этом случае это так же просто, как
String toString(){
return "{ name:\""+name+", password: \""+passowrd....
}
. Второй вариант - использовать отражение. Это было бы немного (хотя и не совсем) лучше, если бы у вас был какой-то внешний класс, используемый для «классов печати». Псевдокод для этого будет
StringBuilder s = new StringBuidler();
for(Field f : fields){
s.append(f.getName() + "\" :\"" + f.get()+ "\"");
}
return s.toString();
Однако это было бы дорогостоящим, поскольку отражение всегда есть. Кроме того, если вы просто правильно переопределяете функции toString
, в первую очередь ваша функция printClass
может быть буквально просто
String printClass(Object o){ return o.toString();}
Что, конечно же, снова задает вопрос о том, зачем вам нужен printClass
функция?
Один из вариантов - использовать Google Gson.
import java.util.ArrayList; import java.util.List; import com.google.gson.Gson;
class Project {
private int year = 1987;
private String name = "ROBOCOP-1";
private boolean active = false;
private List<String> list = new ArrayList<String>() {
{
add("PROTECT THE INNOCENT");
add("UPHOLD THE LAW");
add("SERVE THE PUBLIC TRUST");
add("CLASSIFIED");
}
};
}
public class GsonExample {
public static void main(String[] args) {
Project obj = new Project();
Gson gson = new Gson();
String json = gson.toJson(obj);
System.out.println(gson.toJson(obj));
}
}
Существует много способов добиться того, что вам нужно. Хотя мне было бы интересно , почему вам нужно.
toString()
. см.: http://www.javapractices.com/topic/TopicAction.do?Id=55 UserPrettyPrinter
. public interface UserPrettyPrinter {
string print(User);
}
public class PrintUserInJSON implements UserPrettyPrinter {
string print(User user) {
//implement the algo here
}
}
вы также можете реализовать: public class PrintUserInXML implements UserPrettyPrinter {
string print(User user) {
//implement the algo here
}
}
public class PrintObjectBasicAlgo {
String print(Object obj) {
/* i write pseudo code here. just ask if you cannot implement this
this would help: http://docs.oracle.com/javase/tutorial/reflect/class/classMembers.html
Class class = Obj.getClass();
Filed[] allVariables = class.getAllFieldsByReflection();
ArrayList<String> keys = new ArrayList<String>;
ArrayList<String> values = new ArrayList<String>;
for(Field field : allVariables) {
Object value = reflectionGetValueOfField( field, obj );
keys.add( field.getName());
values.add(value.toString());
}
now that you have the keys and values, you can generate a string in anyway you like
*/
}
}