createBoard() 上的 libbulldog 空指针异常
libbulldog null pointer exception on createBoard()
我正在从事一个 class 项目,该项目涉及控制 beagle bone black 上的引脚,它是 运行 stock debian os。
我添加了库并能够让下面的代码工作。
代码:
package swerve.tracker.robot;
import org.bulldog.beagleboneblack.BBBNames;
import org.bulldog.beagleboneblack.gpio.BBBPwm;
import org.bulldog.core.gpio.Pin;
import org.bulldog.core.gpio.Pwm;
import org.bulldog.core.platform.Board;
import org.bulldog.core.platform.Platform;
import org.bulldog.core.util.BulldogUtil;
import org.bulldog.devices.servo.Servo;
/**
* Created by yoseph on 5/10/2016.
*/
public class Robot {
private Board board;
public void init() {
//board = Platform.createBoard();
//Pwm pwm = board.getPin(BBBNames.ECAPPWM0_P9_42).as(Pwm.class);
//Servo servo = new Servo(pwm);
//servo.setAngle(180.0f);
System.out.println("Started");
BulldogUtil.sleepMs(1000);
System.out.println("Waited 1 second.");
//servo.setAngle(90.0f);
//BulldogUtil.sleepMs(1000);
System.out.println("Waited another second.");
//servo.setAngle(0.0f);
//BulldogUtil.sleepMs(1000);
System.out.println("Finished initializing.");
}
public void update() {
}
public void finish() {
}
public Board getBoard() {
return board;
}
}
控制台输出:
yoseph1998@beaglebone:~/.../$ java -jar SwerveTracker.jar
Started
Waited 1 second.
Waited another second.
Finished initializing.
一旦我取消注释 Board board = Platform.createBoard()
我从库中得到了由该行引起的 NullPointerException
,我在网上搜索了这个问题但一无所获,我按照示例和指南一无所获.这是错误。
控制台输出:
yoseph1998@beaglebone:~/.../$ java -jar SwerveTracker.jar
Exception in thread "Thread-0" java.lang.NullPointerException
at java.util.Hashtable.put(Hashtable.java:459)
at org.bulldog.core.platform.AbstractBoard.setProperty(AbstractBoard.java:94)
at org.bulldog.beagleboneblack.BeagleBoneBlack.createProperties(BeagleBoneBlack.java:265)
at org.bulldog.beagleboneblack.BeagleBoneBlack.<init>(BeagleBoneBlack.java:33)
at org.bulldog.beagleboneblack.BeagleBoneBlackBoardFactory.createBoard(BeagleBoneBlackBoardFactory.java:17)
at org.bulldog.core.platform.Platform.createBoard(Platform.java:13)
at swerve.tracker.robot.Robot.init(Robot.java:18)
at swerve.tracker.robot.framework.Scheduler.run(Scheduler.java:45)
at java.lang.Thread.run(Thread.java:745)
任何人都可以提供帮助,如果没有,那么有人对比 libbulldog 更好的库有任何建议吗?
查看哈希表我们有:
if (value == null) {
throw new NullPointerException(); // 495
}
看来,我们的 Hashtable 值是 null。
返回BeagleBoneBlack.createProperties:265
if(new File("/etc/dogtag").exists()) {
setProperty(BBBProperties.DOGTAG, BulldogUtil.readFileAsString("/etc/dogtag"));
}
看起来像 BulldogUtil.readFileAsString returns null.
public static String readFileAsString(String path) {
try {
byte[] encoded = Files.readAllBytes(Paths.get(path));
return new String(encoded, Charset.defaultCharset());
} catch(Exception ex) {
return null;
}
}
看起来我们在尝试读取文件 /etc/dogtag 时遇到异常。这就是我的魔法结束的地方,因为 Exception 在 readFileAsString 中丢失了。
我的建议是
- 在 catch 子句中放置一个断点以查看根本原因。
- 检查您是否有足够的权限访问该文件
因为我运行这是一个java程序,所以它有来宾用户权限。程序将无法读取或写入任何需要 root 访问权限的文件。当程序调用 Platform.createBoard()
时,它会像 ekaerovets 提到的那样尝试访问 /etc/dogtag
。
有两种方法可以解决这个问题:
- 更改文件的权限为只读。但是之后其他需要权限访问文件的方法和函数也会失败。
- 给程序sudo权限。这是最佳选择,因为这意味着图书馆将能够访问其设计访问的内容。
解决方案
运行有sudo权限的程序如下
sudo java -jar SwerveTracker.jar
我正在从事一个 class 项目,该项目涉及控制 beagle bone black 上的引脚,它是 运行 stock debian os。
我添加了库并能够让下面的代码工作。
代码:
package swerve.tracker.robot;
import org.bulldog.beagleboneblack.BBBNames;
import org.bulldog.beagleboneblack.gpio.BBBPwm;
import org.bulldog.core.gpio.Pin;
import org.bulldog.core.gpio.Pwm;
import org.bulldog.core.platform.Board;
import org.bulldog.core.platform.Platform;
import org.bulldog.core.util.BulldogUtil;
import org.bulldog.devices.servo.Servo;
/**
* Created by yoseph on 5/10/2016.
*/
public class Robot {
private Board board;
public void init() {
//board = Platform.createBoard();
//Pwm pwm = board.getPin(BBBNames.ECAPPWM0_P9_42).as(Pwm.class);
//Servo servo = new Servo(pwm);
//servo.setAngle(180.0f);
System.out.println("Started");
BulldogUtil.sleepMs(1000);
System.out.println("Waited 1 second.");
//servo.setAngle(90.0f);
//BulldogUtil.sleepMs(1000);
System.out.println("Waited another second.");
//servo.setAngle(0.0f);
//BulldogUtil.sleepMs(1000);
System.out.println("Finished initializing.");
}
public void update() {
}
public void finish() {
}
public Board getBoard() {
return board;
}
}
控制台输出:
yoseph1998@beaglebone:~/.../$ java -jar SwerveTracker.jar
Started
Waited 1 second.
Waited another second.
Finished initializing.
一旦我取消注释 Board board = Platform.createBoard()
我从库中得到了由该行引起的 NullPointerException
,我在网上搜索了这个问题但一无所获,我按照示例和指南一无所获.这是错误。
控制台输出:
yoseph1998@beaglebone:~/.../$ java -jar SwerveTracker.jar
Exception in thread "Thread-0" java.lang.NullPointerException
at java.util.Hashtable.put(Hashtable.java:459)
at org.bulldog.core.platform.AbstractBoard.setProperty(AbstractBoard.java:94)
at org.bulldog.beagleboneblack.BeagleBoneBlack.createProperties(BeagleBoneBlack.java:265)
at org.bulldog.beagleboneblack.BeagleBoneBlack.<init>(BeagleBoneBlack.java:33)
at org.bulldog.beagleboneblack.BeagleBoneBlackBoardFactory.createBoard(BeagleBoneBlackBoardFactory.java:17)
at org.bulldog.core.platform.Platform.createBoard(Platform.java:13)
at swerve.tracker.robot.Robot.init(Robot.java:18)
at swerve.tracker.robot.framework.Scheduler.run(Scheduler.java:45)
at java.lang.Thread.run(Thread.java:745)
任何人都可以提供帮助,如果没有,那么有人对比 libbulldog 更好的库有任何建议吗?
查看哈希表我们有:
if (value == null) {
throw new NullPointerException(); // 495
}
看来,我们的 Hashtable 值是 null。
返回BeagleBoneBlack.createProperties:265
if(new File("/etc/dogtag").exists()) {
setProperty(BBBProperties.DOGTAG, BulldogUtil.readFileAsString("/etc/dogtag"));
}
看起来像 BulldogUtil.readFileAsString returns null.
public static String readFileAsString(String path) {
try {
byte[] encoded = Files.readAllBytes(Paths.get(path));
return new String(encoded, Charset.defaultCharset());
} catch(Exception ex) {
return null;
}
}
看起来我们在尝试读取文件 /etc/dogtag 时遇到异常。这就是我的魔法结束的地方,因为 Exception 在 readFileAsString 中丢失了。
我的建议是
- 在 catch 子句中放置一个断点以查看根本原因。
- 检查您是否有足够的权限访问该文件
因为我运行这是一个java程序,所以它有来宾用户权限。程序将无法读取或写入任何需要 root 访问权限的文件。当程序调用 Platform.createBoard()
时,它会像 ekaerovets 提到的那样尝试访问 /etc/dogtag
。
有两种方法可以解决这个问题:
- 更改文件的权限为只读。但是之后其他需要权限访问文件的方法和函数也会失败。
- 给程序sudo权限。这是最佳选择,因为这意味着图书馆将能够访问其设计访问的内容。
解决方案
运行有sudo权限的程序如下
sudo java -jar SwerveTracker.jar