【问题标题】:Get only class name as string仅获取类名作为字符串
【发布时间】:2023-03-04 07:33:07
【问题描述】:

我有一个在 Apple 和 Banana 中实现的接口 Fruit。在我的主类中,Fruit 被称为如下:

Fruit fruit = new Apple();

如何检索“Apple”字符串?使用

fruit.getClass().getName()

fruit.getClass().getSimpleName()

给出一个 java.lang.NullPointerException

我试图避免在 AppleBanana 中创建函数,例如getClassName().

编辑:添加更多细节/方法,因为我上面的简化问题似乎并没有指出问题所在。添加超过以下内容将意味着复制整个代码。同样,下面是一个简化。

public class Clustering {
    private DistanceMeasure measure;  //Manhattan or Euclidean
    private ClusterMethod method;  //SingleLinkage or CompleteLinkage
    private Clusterer clusterer;

public static void main(String[] args) {
    new Clustering().start();
}
    Clustering() {
         measure = new Manhattan();
         method = new SingleLinkage(measure);
         clusterer = new Clusterer(method);
    }
    void start() {
        clusterer = setMethod();
        clusterer.next(); //would use the ClusterMethod to do some calculations; clusterMethod which is saved inside Clusterer class when creating the new class i.e. new Clusterer(method). the nullException occurs here
    }
    Clusterer setMethod() {
        measure = new Euclidean();
        if (method.getClass().getSimpleName().equals("SingleLinkage")) {
             method = new CompleteLinkage(measure);
        }
        else method = new SingleLinkage(measure);
        return new Clusterer(method);
    }
}

以上看起来正确吗?使用 clusterer.next() 时会发生 nullException,它在不使用 setMethod() 的情况下工作正常。

【问题讨论】:

  • fruit.getClass().getSimpleName() 返回什么?
  • 在对类名进行运行时测试之前,您的 Fruit 引用是否已分配给 Apple 实例以外的对象?
  • 在使用 getName() 或 getSimpleName() 时出现 java.lang.NullPointerException
  • @Dimebag:不是来自fruit.getClass().getSimpleName(),你不知道。请发布一个简短但完整的程序来演示该问题,并请让您的问题比“似乎不起作用”更具体。
  • @Dimebag 是一个完全不同的问题。你的水果没有被正确实例化

标签: java class


【解决方案1】:

来自 cmets 的响应:您的 fruit.getClass()... 调用会引发 NullPointerException

这意味着您的fruit 变量在测试类名时被分配了一个null 值,这可能发生在为它分配@987654326 的新实例之后@。

null Object 上调用方法将抛出NullPointerException

注意

事后考虑,如果NullPointerException 在到达getClass() 方法调用之前 被抛出,那么您的代码的其他部分会出现不同的问题,即抛出NullPointerException 和根本与运行时类名检查无关。

【讨论】:

  • 这似乎是第二种选择。 getSimpleName() 确实返回了名称,但我的代码中的其他内容在执行此操作后似乎不起作用。我会在更多的“玩”之后回来。
  • 用我正在使用的更简洁的代码修改了原始问题。请看一下。
  • @Dimebag 您还没有发布您的Clusterer 类,即next 方法中的代码,根据您自己的评论,这就是导致NPE 的原因。我建议提出一个新问题。
猜你喜欢
  • 2015-11-25
  • 1970-01-01
  • 2010-12-06
  • 2013-08-27
  • 1970-01-01
  • 2012-06-09
相关资源
最近更新 更多