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 中丢失了。

我的建议是

  1. 在 catch 子句中放置一个断点以查看根本原因。
  2. 检查您是否有足够的权限访问该文件

因为我运行这是一个java程序,所以它有来宾用户权限。程序将无法读取或写入任何需要 root 访问权限的文件。当程序调用 Platform.createBoard() 时,它会像 ekaerovets 提到的那样尝试访问 /etc/dogtag

有两种方法可以解决这个问题:

  • 更改文件的权限为只读。但是之后其他需要权限访问文件的方法和函数也会失败。
  • 给程序sudo权限。这是最佳选择,因为这意味着图书馆将能够访问其设计访问的内容。

解决方案

运行有sudo权限的程序如下

sudo java -jar SwerveTracker.jar