对于建议抛出异常的人:
抛出异常不会给我一个编译时错误,它会给我一个运行时错误.我知道我可以抛出一个异常,我宁愿在编译期间死也不会在运行时死掉.
首先,我使用的是eclipse 3.4.
我有一个数据模型,其模式属性是枚举.
enum Mode {on(...), off(...), standby(...); ...}
Run Code Online (Sandbox Code Playgroud)
我目前正在写这个模型的视图,我有代码
...
switch(model.getMode()) {
case on:
return getOnColor();
case off:
return getOffColor();
case standby:
return getStandbyColor();
}
...
Run Code Online (Sandbox Code Playgroud)
我收到错误"此方法必须返回类型java.awt.Color的结果",因为我没有默认情况,并且在函数末尾没有返回xxx. 我想在有人为枚举添加另一种类型的情况下出现编译错误(例如关闭)所以我不想放置抛出AssertionError的默认情况,因为这将使用修改后的模式进行编译而不会被视为错误直到运行时.
我的问题是:
为什么EclipseBuilder(和javac)没有意识到这个开关涵盖了所有可能性(或者它是否涵盖了它们?)并且停止警告我需要返回类型.有没有办法,我可以做我想要的,而无需向Mode添加方法?
如果失败了,是否有一个选项可以在不包含所有Enum可能值的switch语句上发出警告/错误?
编辑:Rob:这是一个编译错误.我只是尝试用javac编译它,我得到一个"缺少返回语句"错误,目标是方法的最后一个}.Eclispe只是将错误放在方法的顶部.
我想知道为什么堆概念作为算法(实现make_heap,pop_heap, push_heap,sort_heap),而不是一个容器.我特别感兴趣的是一些人的解决方案也可以解释为什么set和map容器而不是类似的算法集合(make_set add_set rm_set等).
我刚开始使用OSGi编程,并且有两种方法可以监听被激活的服务.
第一种方法,从EclipseRCP书籍,使用ServiceReference:
String filter="(objectclass="+IModelCreator.class.getName()+")";
context.addServiceListener(this, filter);
modelCreators = Collections.synchronizedMap(
new HashMap<ModelID, List<IModelCreator>>());
ServiceReference references[] = context.getServiceReferences(null, filter);
if(references==null) return;
for(int i=0;i<references.length;++i) {
this.serviceChanged(new ServiceEvent(ServiceEvent.REGISTERED,
references[i]));
}
Run Code Online (Sandbox Code Playgroud)
第二个,来自互联网示例,使用ServiceTracker:
ServiceTracker logReaderTracker = new ServiceTracker(context,
org.osgi.service.log.LogReaderService.class.getName(), null);
logReaderTracker.open();
Object[] readers = logReaderTracker.getServices();
if (readers != null) {
for (int i = 0; i < readers.length; i++) {
LogReaderService lrs = (LogReaderService) readers[i];
m_readers.add(lrs);
lrs.addLogListener(m_logger);
}
}
logReaderTracker.close();
Run Code Online (Sandbox Code Playgroud)
哪一个是保存实现给定接口的所有服务的寄存器的正确和/或最佳方式?有没有其他方法来实现这一目标?为什么似乎有两种方法可以做同样的事情?
我有一组模板/函数,允许我打印一个元组/对,假设元组/对中的每个类型都operator<<为它定义.不幸的是,由于17.4.3.1,添加我的operator<<重载是违法的std.还有另一种让ADL找到我的方法operator<<吗?如果没有,包裹我的超载是否有任何实际伤害namespace std{}?
感兴趣的人的代码:(我正在使用gcc-4.5)
namespace tuples {
using ::std::tuple;
using ::std::make_tuple;
using ::std::get;
namespace detail {
template< typename...args >
size_t size( tuple<args...> const& )
{
return sizeof...(args);
};
template<size_t N>
struct for_each_ri_impl
{
template<typename Func, typename Tuple>
void operator()(Func func, Tuple const& arg)
{
for_each_ri_impl<N-1>()(func, arg );
func( get<N>( arg ), size(arg) - N - 1 );
}
};
template<>
struct for_each_ri_impl<0>
{
template<typename Func, typename Tuple>
void operator()(Func func, Tuple …Run Code Online (Sandbox Code Playgroud) 我有以下会员数据
vector<State<T>*> activeChildren;
Run Code Online (Sandbox Code Playgroud)
我想在析构函数中清理这些指针
StateContainer<T>::~StateContainer() {
vector<State<T>*>::iterator it =
activeChildren.begin();
while(it!=activeChildren.end()) {
State<T>* ptr = *it;
it = activeChildren.erase(it);
delete ptr;
}
}
Run Code Online (Sandbox Code Playgroud)
我在Ubuntu上从g ++ 4.3.2得到以下错误:
./fsm2/StateContainer.cpp: In destructor ‘virtual ervan::StateContainer<T>::~StateContainer()’:
../fsm2/StateContainer.cpp:24: error: expected `;' before ‘it’
../fsm2/StateContainer.cpp:25: error: ‘it’ was not declared in this scope
Run Code Online (Sandbox Code Playgroud)
谁能告诉我我做错了什么?我在另外两个使用迭代器循环的地方得到了这个错误,但是当我使用for_each(...)时却没有
所以,假设我有一个char,我想在一行代码中将它strcat()转换为char数组.对于[非实际]示例:
strcat("ljsdflusdfg",getchar());
Run Code Online (Sandbox Code Playgroud)
或者我想反过来说,无论数据类型如何,连接或类型转换字符串的适当功能是什么?或者也许有一些我遗漏的语法......
这是一个例子.它编译得很好,但崩溃.
char* input(){
char* inp="";
while(1){
char c=getchar();
if(c){
if(c=='\n'||c==EOF){
break;
}else{
strcat(inp,(char*)c);
}
}
}
return inp;
}
Run Code Online (Sandbox Code Playgroud)